package application;

import ij.process.ImageProcessor;

import java.util.ArrayList;


public class Bloc {
	private Ligne ligneHaut = null;
	private Ligne ligneBas = null;
	private int hauteur = 0;
	private int largeur = 0;
	private int xDebut = 0;
	private int xFin = 0;
	private int yDebut = 0;
	private int yFin = 0;
	private String name;
	public Bloc(Ligne haut,Ligne bas,String name) {
		this.ligneHaut=haut;
		this.ligneBas=bas;
		this.hauteur=bas.getY()-haut.getY();
		this.largeur=haut.getTaille();
		this.xDebut=ligneHaut.getDebut();
		this.xFin=ligneHaut.getFin();
		this.yDebut=ligneHaut.getY();
		this.yFin=ligneBas.getY();
		this.name=name;
	}
	
	public Bloc(Ligne haut,Ligne bas) {
		this.ligneHaut=haut;
		this.ligneBas=bas;
		this.hauteur=bas.getY()-haut.getY();
		this.largeur=haut.getTaille();
		this.xDebut=ligneHaut.getDebut();
		this.xFin=ligneHaut.getFin();
		this.yDebut=ligneHaut.getY();
		this.yFin=ligneBas.getY();
		this.name=null;
	}
	/**
	 * @return the hauteur
	 */
	public int getHauteur() {
		return hauteur;
	}
	/**
	 * @return the largeur
	 */
	public int getLargeur() {
		return largeur;
	}
	/**
	 * @return the ligneHaut
	 */
	public Ligne getLigneHaut() {
		return ligneHaut;
	}
	/**
	 * @return the ligneBas
	 */
	public Ligne getLigneBas() {
		return ligneBas;
	}




	/**
	 * @return the xDebut
	 */
	public int getxDebut() {
		return xDebut;
	}
	/**
	 * @return the xFin
	 */
	public int getxFin() {
		return xFin;
	}
	/**
	 * @return the yDebut
	 */
	public int getyDebut() {
		return yDebut;
	}
	/**
	 * @return the yFin
	 */
	public int getyFin() {
		return yFin;
	}
	public boolean isEncapsulates(Bloc b1){
		if(isSuperimposeHorizontal(b1) && isSuperimposeVertical(b1))return true;
		return false;
	}
	public boolean isSuperimposeHorizontal (Bloc b1){
		int marge = 3;
		if((b1.getxDebut()>=this.getxDebut()-marge)&&(b1.getxDebut()<=this.getxFin()+marge))return true;
		if((b1.getxFin()>=this.getxDebut()-marge)&&(b1.getxFin()<=this.getxFin()+marge))return true;
		
		if((b1.getxDebut()<=(this.getxDebut()-marge))&&((this.getxFin()+marge)<=b1.getxFin()))return true;
		
		return false;
	}

	public boolean isSuperimposeVertical (Bloc b1){
		int marge = 3;
		if(b1.getyDebut()>=this.getyDebut()-marge&&b1.getyDebut()<=this.getyFin()+marge)return true;
		if(b1.getyFin()>=this.getyDebut()-marge&&b1.getyFin()<=this.getyFin()+marge)return true;
		return false;
	}



	public void fusionBloc(Bloc b1){
		int newXDebut = 0;
		int newXFin = 0;
		int newYDebut = 0;
		int newYFin = 0;

		if(b1.getxDebut()<this.getxDebut()){
			newXDebut=b1.getxDebut();
		}else{
			newXDebut=this.getxDebut();
		}
		if(b1.getxFin()>this.getxFin()){
			newXFin=b1.getxFin();
		}else{
			newXFin=this.getxFin();
		}
		if(b1.getyDebut()<this.getyDebut()){
			newYDebut=b1.getyDebut();
		}else{
			newYDebut=this.getyDebut();
		}
		if(b1.getyFin()>this.getyFin()){
			newYFin=b1.getyFin();
		}else{
			newYFin=this.getyFin();
		}
		this.xDebut=newXDebut;
		this.xFin=newXFin;
		this.yDebut=newYDebut;
		this.yFin=newYFin;
		this.ligneHaut=new Ligne(newYDebut, newXDebut, newXFin);
		this.ligneBas=new Ligne(newYFin, newXDebut, newXFin);
		this.hauteur=newYFin-newYDebut;
		this.largeur=newXFin-newXDebut;
	}


	public static void fusionBlocs(ArrayList<Bloc> list){
		boolean fusion=true;
		Bloc b1 = null;
		Bloc b2 = null;
		while(fusion){
			fusion=false;
			for(int i=0;i<list.size();i++){
				b1 = list.get(i);
				for(int j=i+1;j<list.size();j++){
					b2 = list.get(j);
					if(b1.isEncapsulates(b2)){
						b1.fusionBloc(b2);
						list.remove(b2);
						fusion=true;
					}
				}
			}
		}
	}
//For Debugging only
//	public static void main(String args[]){
//
//		ImagePlus im= new ImagePlus("journal4.jpg");
//		ImageProcessor ip = im.getProcessor();
//		ip = ip.createProcessor(ip.getWidth(), ip.getHeight());
//		ip.drawPixel(50, 50);
//		ip.setColor(Color.white);
//		im.setProcessor(null, ip);
//		im.show();
//		Bloc b0 = new Bloc(new Ligne(100, 300, 400), new Ligne(200, 300, 400),"B0");
//
//
//		int xdebut1 = 280;
//		int xFin1= xdebut1+40;
//
//		int xdebut2 = 330;
//		int xFin2= xdebut2+40;
//
//		int xdebut3 = 380;
//		int xFin3= xdebut3+40;
//
//		int y1 = 95;
//		int y2 = y1+20;
//
//		int y3 = 130;
//		int y4 = y3+40;
//
//		int y5 = 180;
//		int y6 = y5+40;
//
//		Bloc b1 = new Bloc(new Ligne(y1, xdebut1, xFin1), new Ligne(y2, xdebut1, xFin1),"B1");
//		Bloc b2 = new Bloc(new Ligne(y1, xdebut2, xFin2), new Ligne(y2, xdebut2, xFin2),"B2");
//		Bloc b3 = new Bloc(new Ligne(y1, xdebut3, xFin3), new Ligne(y2, xdebut3, xFin3),"B3");
//
//		Bloc b4 = new Bloc(new Ligne(y3, xdebut1, xFin1), new Ligne(y4, xdebut1, xFin1),"B4");
//		Bloc b5 = new Bloc(new Ligne(y3, xdebut2, xFin2), new Ligne(y4, xdebut2, xFin2),"B5");
//		Bloc b6 = new Bloc(new Ligne(y3, xdebut3, xFin3), new Ligne(y4, xdebut3, xFin3),"B6");
//
//		Bloc b7 = new Bloc(new Ligne(y5, xdebut1, xFin1), new Ligne(y6, xdebut1, xFin1),"B7");
//		Bloc b8 = new Bloc(new Ligne(y5, xdebut2, xFin2), new Ligne(y6, xdebut2, xFin2),"B8");
//		Bloc b9 = new Bloc(new Ligne(y5, xdebut3, xFin3), new Ligne(y6, xdebut3, xFin3),"B9");
//
//		b0.fusionBloc(b1);
//		if(b2.isEncapsulates(b0)){
//			b0.fusionBloc(b2);
//		}
//		b0.fusionBloc(b3);
//		b0.fusionBloc(b4);
//		b0.fusionBloc(b5);
//		b0.fusionBloc(b6);
//		b0.fusionBloc(b7);
//		b0.fusionBloc(b8);
//		b0.fusionBloc(b9);
//
//		ArrayList<Bloc> list = new ArrayList<Bloc>();
//		list.add(b1);
//		list.add(b2);
//		list.add(b3);
//		list.add(b4);
//		list.add(b5);
//		list.add(b6);
//		list.add(b7);
//		list.add(b8);
//		list.add(b9);
//		list.add(b0);
//		Bloc.fusionBlocs(list);
//		System.out.println(list.size());
//		ip.drawRect(b0.xDebut, b0.yDebut, b0.largeur, b0.hauteur);
//		ip.drawRect(b1.xDebut, b1.yDebut, b1.largeur, b1.hauteur);
//		ip.drawRect(b2.xDebut, b2.yDebut, b2.largeur, b2.hauteur);
//		ip.drawRect(b3.xDebut, b3.yDebut, b3.largeur, b3.hauteur);
//		ip.drawRect(b4.xDebut, b4.yDebut, b4.largeur, b4.hauteur);
//		ip.drawRect(b5.xDebut, b5.yDebut, b5.largeur, b5.hauteur);
//		ip.drawRect(b6.xDebut, b6.yDebut, b6.largeur, b6.hauteur);
//		ip.drawRect(b7.xDebut, b7.yDebut, b7.largeur, b7.hauteur);
//		ip.drawRect(b8.xDebut, b8.yDebut, b8.largeur, b8.hauteur);
//		ip.drawRect(b9.xDebut, b9.yDebut, b9.largeur, b9.hauteur);
//
//
//
//	}

	/**
	 * @return
	 * @see application.Ligne#toString()
	 */
	public String toString() {
		return name;
	}
	public static void traceBloc(Bloc bloc,ImageProcessor ip){
		ip.drawRect(bloc.xDebut, bloc.yDebut, bloc.largeur, bloc.hauteur);
	}

	public void traceBloc(ImageProcessor ip){
		ip.drawRect(this.xDebut, this.yDebut, this.largeur, this.hauteur);
	}

	public int getAir() {
		return getHauteur()*getLargeur();
	}
}
